/* Copyright 2006, 2007, 2008, 2009, 2010 do SETEC/MEC
 *
 * Este arquivo é parte do programa SigaEPT
 *
 * O SigaEPT é um software livre;  você pode redistribuí-lo e/ou modificá-lo dentro dos
 * termos da Licença Pública Geral GNU como publicada pela fundação do software livre (FSF);
 * na versão 2 da Licença.
 *
 * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA GARANTIA; sem
 * uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou APLICAÇÃO EM PARTICULAR. Veja Licença
 * Pública Geral GNU/GPL em português para maiores detalhes.
 *
 * Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob o título “LICENCA.txt”,
 * junto com este programa, se não, acesse o portal do Software Público Brasileiro no endereço
 * www.softwarepublico.gov.br ou escreva para Fundação do Software Livre (FSF) Inc.,51 Franklin
 * St, Fifth Floor, Boston, MA 02110-1301, USA
 */

package br.org.ccb.ccbadm.auth;

import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class CriptografiaUtil {

	private static final String ALGORITMO_HASH = "MD5";
	
	private MessageDigest md5;
	
	private static CriptografiaUtil singleton;
	
	private CriptografiaUtil() {
		try {
			md5 = MessageDigest.getInstance(ALGORITMO_HASH);
		} catch (NoSuchAlgorithmException e) {
			System.err.println("Algoritmo de hash inválido: " + e.getMessage());
		}
	}
	
	public static CriptografiaUtil obterInstancia(){
		if(singleton == null){
			singleton = new CriptografiaUtil();
		}
		return singleton;		
	}

	public byte[] criptografarComMD5(byte[] bytesACriptografar) {
		if (bytesACriptografar == null) {
			throw new NullPointerException("A senha não pode ser null");
		}
		return this.md5.digest(bytesACriptografar);
	}
	
	public String criptografarComMD5(String stringACriptografar) {
		byte[] bytesACriptografar = stringACriptografar.getBytes();
		BigInteger hash = new BigInteger(1, criptografarComMD5(bytesACriptografar));
		String stringCriptografada = hash.toString(16);
		if (stringCriptografada.length() % 2 != 0)
			stringCriptografada = String.valueOf(0) + stringCriptografada;
		return stringCriptografada;
	}

	public static String md5ToString(byte[] md5) {
		BigInteger hash = new BigInteger(1, md5);
		String s = hash.toString(16);
		if (s.length() % 2 != 0)
			s = String.valueOf(0) + s;
		return s;
	}
	
}
